package som.simon.reactor;

import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.Arrays;
import java.util.List;

public class ReactorMain {

    // 反应式编程是一种与数据流和变化传播有关的异步编程范例。
    // 这意味着可以通过所使用的编程语言轻松地表达静态（例如数组）或动态（例如事件发射器）数据流。

    // 除了推送值之外，还以明确定义的方式涵盖了错误处理和完成方面。APublisher可以向其推送新值Subscriber（通过调用onNext），但也可以发出错误信号（通过调用onError）或完成（通过调用onComplete）。错误和完成都会终止序列。这可以总结如下
    // onNext x 0..N [onError | onComplete]

    public static void main(String[] args) {

        // 最简单的开始使用Flux和 的方法Mono是使用在各自的类中找到的众多工厂方法之一。
        // 例如，要创建 的序列String，您可以枚举它们或将它们放入集合中并从中创建 Flux，如下所示
        Flux<String> seq1 = Flux.just("foo", "bar", "foobar");

        List<String> iterable = Arrays.asList("foo", "bar", "foobar");
        Flux<String> seq2 = Flux.fromIterable(iterable);

        // 工厂方法的其他示例包括：

        // 请注意，工厂方法遵循泛型类型，即使它没有值。
        Mono<String> noData = Mono.empty();
        Mono<String> data = Mono.just("foo");
        // 第一个参数是范围的开始，第二个参数是要生产的项目数。
        Flux<Integer> numbersFromFiveToSeven = Flux.range(5, 3);


        // 在订阅方面，Flux请Mono使用 Java 8 lambda。您有多种.subscribe()变体可供选择，这些变体采用 lambda 来实现不同的回调组合，如以下方法签名所示：
        //
        // 示例 10. 基于 Lambda 的订阅变体Flux

        // 	订阅并触发序列。
        // subscribe();
        // 对每个产生的价值做一些事情。
        // subscribe(Consumer<? super T> consumer);
        // 处理价值观，但也要对错误做出反应。
        // subscribe(Consumer<? super T> consumer,
        //           Consumer<? super Throwable> errorConsumer);
        // 处理值和错误，但在序列成功完成时运行一些代码。
        // subscribe(Consumer<? super T> consumer,
        //           Consumer<? super Throwable> errorConsumer,
        //           Runnable completeConsumer);
        // 处理值和错误并成功完成，但也 Subscription对该subscribe调用产生的结果执行一些操作。
        // subscribe(Consumer<? super T> consumer,
        //           Consumer<? super Throwable> errorConsumer,
        //           Runnable completeConsumer,
        //           Consumer<? super Subscription> subscriptionConsumer);
    }

}
